package gti310.tp3.solver;

import java.util.LinkedList;


/**
 * La classe Sommet contient l'identité de la valeur en entier du sommet d'un
 * graphe. Elle contient une méthode permettant la connexion vers un autre
 * sommet.
 * 
 * @author Emile Robinson et Fredy Alexander Bonilla
 * @date 2014-11-07
 */
public class Sommet implements Comparable<Sommet>{

	private int id;	
	private int minDistance;
	private Sommet precedent;
	private Connector c;
	private LinkedList<Connector> voisins;

	/**
	 * Constructeur recevant en paramètre l'entier formant le sommet
	 * @param id
	 */
	public Sommet(int id){
		this.id = id; 
	}
	
	/**
	 * Constructeur recevant en paramètre l'entier formant le sommet et sa 
	 * valeur minimale
	 * @param id
	 */
	public Sommet(int id, int valInfini){
		this.id = id; 
		minDistance = valInfini;
	}

	/**
	 * Retourne le ID (valeur) du sommet.
	 * @return id
	 */
	public int getId(){
		return id;
	}
	
	/**
	 * Retourne la valeur de la distance minimal. 
	 * 
	 * @return minDistance
	 */
	public int getMinDistance(){
		return minDistance;
	}
	
	/**
	 * Retourne le sommet précédent. 
	 * 
	 * @return precedent
	 */
	public Sommet getPrecedent(){
		return precedent;
	}
	
	/**
	 * Retourne la liste des voisins du sommet actuel
	 * @return voisins
	 */
	public LinkedList<Connector> getVoisins(){
		return voisins;
	}
	
	/**
	 * Mutateur de la valeur de distance minimale
	 * 
	 * @param minDistance
	 */
	public void setMinDistance(int minDistance){
		this.minDistance = minDistance;
	}
	
	/**
	 * Mutateur de la valeur du sommet précédent
	 * @param precedent
	 */
	public void setPrecedent(Sommet precedent){
		this.precedent = precedent;
	}

	/**
	 * Méthode permettant de creer la connection d'un sommet à l'autre
	 * 
	 * @param other
	 * @param distance
	 */
	public void connectTo(Sommet other, int distance){		

		c = new Connector(this, other, distance);

		//Ajout de voisin s'il n'est pas déja présent
		if(!voisins.contains(c))
			voisins.add(c);
	}
	
	/**
	 * Creation d'une nouvelle liste de voisins
	 */
	public void creerListeVoisins(){
		voisins = new LinkedList<Connector>();
	}
	
	/**
	 * Retourne la différence des valeur distances minimales des sommets 
	 * comparés. 
	 * 
	 * @param other
	 * @return la résultat de Integer.compare
	 */
	public int compareTo(Sommet other) {

		return Integer.compare(minDistance, other.minDistance);
	}
	
	/**
	 * La méthode d'affichage des voisin a été créé pour fin de vérifications
	 * lors de l'attribution des voisins aux sommets dans ConcreteSolver.
	 */
	public void afficherVoisins(){
		for(int i=0; i<voisins.size(); i++){
			System.out.print(voisins.get(i).getDestination().getId()+" ");
		}
	}
}
